﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace QLNSTL
{
    public partial class frmPhongBan : Form
    {
        QLNS_TLDataContext dc = new QLNS_TLDataContext();
        PhongBan pb = null;
        public frmPhongBan()
        {
            InitializeComponent();
        }

        private DataTable Convert_Table(IQueryable<PhongBan> table)
        {
            DataTable result = new DataTable();
            result.Columns.Add("MaPB");
            result.Columns.Add("Tên Phòng");
            result.Columns.Add("Trưởng phòng");
            result.Columns.Add("Mô tả");

            foreach (var r in table)
            {
                DataRow row = result.NewRow();
                row["MaPB"] = r.maPhongBan;
                row["Tên Phòng"] = r.tenPhongBan;
                if (r.NhanVien != null)
                {
                    row["Trưởng phòng"] = r.NhanVien.hoTen; 
                }
                row["Mô tả"] = r.moTa;
                result.Rows.Add(row);
            }
            return result;
        }

        private void Load_DataGrid()
        {
            QLNS_TLDataContext dc = new QLNS_TLDataContext();
            var pbs = from p in dc.PhongBans
                      select p;
            if (pbs != null)
            {
                dataGridView1.DataSource = Convert_Table(pbs);
                dataGridView1.Columns["MaPB"].Visible = false;
            }
        }

        private void Load_ComboBox()
        {
            try
            {
                QLNS_TLDataContext dc = new QLNS_TLDataContext();
                var nvs = from n in dc.NhanViens
                          where n.ChucVu.tenChucVu == "Trưởng phòng"
                          select n;
                if (nvs != null)
                {
                    cbTruongPhong.DataSource = nvs;
                    cbTruongPhong.DisplayMember = "hoTen";
                    cbTruongPhong.ValueMember = "maNV";
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi trong quá trình tải thông tin các nhân viên có chức vụ trưởng phòng.\n\nChi tiết:\n" + ex.Message);
            }
        }

        private void Load_Detail(int ma)
        {
            try
            {
                dc = new QLNS_TLDataContext();
                pb = dc.PhongBans.SingleOrDefault(p => p.maPhongBan == ma);
                if (pb != null)
                {
                    txtTenPhong.Text = pb.tenPhongBan;
                    txtMoTa.Text = pb.moTa;
                    if (pb.maNV_TP != null)
                    {
                        cbTruongPhong.SelectedValue = pb.maNV_TP; 
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi trong quá trình tải thông tin phòng ban.\n\nChi tiết:\n" + ex.Message);
            }

        }

        private void dataGridView1_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex < 0)
            {
                return;
            }
            if (dataGridView1.Rows[e.RowIndex].Cells["MaPB"].Value != DBNull.Value)
            {
                int maPB = int.Parse(dataGridView1.Rows[e.RowIndex].Cells["MaPB"].Value.ToString());
                Load_Detail(maPB);
                btLuu.Text = "Cập nhật";
            }
        }

        private void ChuanBiTaoMoi()
        {
            dc = new QLNS_TLDataContext();
            pb = null;
            btLuu.Text = "Tạo";
            txtMoTa.Text = "";
            txtTenPhong.Text = "";
        }

        private void btThem_Click(object sender, EventArgs e)
        {
            ChuanBiTaoMoi();
        }

        private void btXoa_Click(object sender, EventArgs e)
        {
            if (dataGridView1.SelectedRows.Count < 1)
            {
                MessageBox.Show("Vui lòng chọn một phòng ban.");
                return;
            }

            if (dataGridView1.SelectedRows[0] != null)
            {
                if (dataGridView1.SelectedRows[0].Cells["MaPB"].Value != null)
                {
                    QLNS_TLDataContext dc1 = new QLNS_TLDataContext();
                    int ma = int.Parse(dataGridView1.SelectedRows[0].Cells["MaPB"].Value.ToString());
                    var dsnv = from nv in dc1.NhanViens
                               where nv.maPhongBan == ma
                               select nv;
                    if (dsnv != null)
                    {
                        if (dsnv.Count() > 0)
                        {
                            MessageBox.Show("Không thể xóa phòng ban đã chọn.\n\nVẫn còn nhân viên thuộc phòng ban muốn xóa.");
                            return;
                        }
                    }

                    if (MessageBox.Show("Bạn có chắc là muốn xóa phòng ban đã chọn", "Confirm", MessageBoxButtons.YesNo) == DialogResult.Yes)
                    {

                        try
                        {
                            QLNS_TLDataContext dc = new QLNS_TLDataContext();
                            var kt = dc.PhongBans.SingleOrDefault(k => k.maPhongBan == ma);
                            dc.PhongBans.DeleteOnSubmit(kt);
                            dc.SubmitChanges();
                            MessageBox.Show("Đã xóa phòng ban.");
                            refresh();
                        }
                        catch (Exception ex)
                        {
                            MessageBox.Show("Có lỗi trong quá trình truy cập dữ liệu. Không thể xóa phòng ban. \n\nChi tiết:\n" + ex.Message);
                        }
                    }
                }
            }
        }

        private void HuyNhiemVuTruongPhong(int maNV)
        {
            QLNS_TLDataContext dc1 = new QLNS_TLDataContext();
            var pbs = from p in dc1.PhongBans
                      where p.maNV_TP == maNV
                      select p;

            foreach (var item in pbs)
            {
                item.maNV_TP = (int?)null;
            }
            dc1.SubmitChanges(); 

        }

        private void btLuu_Click(object sender, EventArgs e)
        {
            if (txtMoTa.Text.Length < 1 || txtTenPhong.Text.Length < 1)
            {
                MessageBox.Show("Vui lòng điền đầy đủ thông tin.");
                return;
            }
            try
            {
                if (dc != null)
                {
                    if (pb == null)
                    {
                        pb = new PhongBan();
                        #region maPhongBan
                        int maPBMax = 1;
                        if (dc.PhongBans.Count() > 0)
                        {
                            maPBMax = (from n in dc.PhongBans select n.maPhongBan).Max();
                            maPBMax++;
                        }
                        pb.maPhongBan = maPBMax;
                        #endregion


                        pb.tenPhongBan = txtTenPhong.Text;
                        if (cbTruongPhong.SelectedValue != null)
                        {
                            pb.maNV_TP = (int)cbTruongPhong.SelectedValue;
                        }

                        //Gán mã trưởng phòng của các phòng khác nhận nhân viên này làm trưởng phòng về null
                        HuyNhiemVuTruongPhong(pb.maNV_TP.Value);

                        pb.moTa = txtMoTa.Text;
                        dc.PhongBans.InsertOnSubmit(pb);
                        //Gán mã phòng cho nhân viên
                        var nv = dc.NhanViens.SingleOrDefault(n => n.maNV == pb.maNV_TP);
                        if (nv != null)
                        {
                            nv.maPhongBan = pb.maPhongBan;
                        }
                        dc.SubmitChanges();
                        MessageBox.Show("Thêm phòng ban thành công.");
                    }
                    else
                    {
                        pb.tenPhongBan = txtTenPhong.Text;

                        if (cbTruongPhong.SelectedValue != null)
                        {
                            pb.maNV_TP = (int)cbTruongPhong.SelectedValue;
                        }
                        //Gán mã trưởng phòng của các phòng khác nhận nhân viên này làm trưởng phòng về null
                        HuyNhiemVuTruongPhong(pb.maNV_TP.Value);
                        pb.moTa = txtMoTa.Text;
                        //Gán mã phòng cho nhân viên
                        var nv = dc.NhanViens.SingleOrDefault(n => n.maNV == pb.maNV_TP);
                        if (nv != null)
                        {
                            nv.maPhongBan = pb.maPhongBan;
                        }
                        dc.SubmitChanges();
                        MessageBox.Show("Cập nhật thông tin phòng ban thành công.");
                    }
                    refresh();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Không thể lưu thông tin nhân viên. Có lỗi trong quá trình truy cập cơ sở dữ liệu.\n\nChi tiết:\n" + ex.Message);
                return;
            }
        }

        private void btThoat_Click(object sender, EventArgs e)
        {
            Close();
        }

        private void refresh()
        {
            Load_DataGrid();
            Load_ComboBox();
            ChuanBiTaoMoi();
        }

        private void frmPhongBan_Load(object sender, EventArgs e)
        {
            refresh();
        }
    }
}
